ã€ãã³ããœãŒã·ã³ã°ãããã«ç£æ»èšŒè·¡ã®å®è£ ã驿°ããæ¯é¡ãªã远跡å¯èœæ§ãããŒã¿æŽåæ§ãã·ã¹ãã å埩åãããããããæ¢ããŸããå®è·µçãªäŸãšå®è£ æŠç¥ãã玹ä»ããŸãã
ã€ãã³ããœãŒã·ã³ã°ïŒå ç¢ã§è¿œè·¡å¯èœãªã·ã¹ãã ã®ããã®ç£æ»èšŒè·¡ã®å®è£
仿¥ã®è€éã§çžäºæ¥ç¶ãããããžã¿ã«ç°å¢ã«ãããŠãå ç¢ã§å æ¬çãªç£æ»èšŒè·¡ã®ç¶æã¯æ¥µããŠéèŠã§ããããã¯å€ãã®å ŽåãèŠå¶èŠä»¶ã§ããã ãã§ãªãããããã°ãã»ãã¥ãªãã£åæãããã³ã·ã¹ãã ã®é²åãçè§£ããããã«ãäžå¯æ¬ ã§ããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãžã®ãã¹ãŠã®å€æŽãã€ãã³ãã®ã·ãŒã±ã³ã¹ãšããŠãã£ããã£ããã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ããã€ãã³ããœãŒã·ã³ã°ã¯ãä¿¡é Œæ§ããããç£æ»å¯èœã§ãæ¡åŒµæ§ã®ããç£æ»èšŒè·¡ãå®è£ ããããã®ãšã¬ã¬ã³ãã§åŒ·åãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ã€ãã³ããœãŒã·ã³ã°ãšã¯ïŒ
åŸæ¥ã®ã¢ããªã±ãŒã·ã§ã³ã¯éåžžãããŒã¿ããŒã¹ã«ããŒã¿ã®çŸåšã®ç¶æ ã®ã¿ãä¿åããŸãããã®ã¢ãããŒãã§ã¯ãéå»ã®ç¶æ ãåæ§ç¯ããããçŸåšã®ç¶æ ã«è³ã£ãäžé£ã®ã€ãã³ããçè§£ãããããããšãå°é£ã§ããå¯Ÿç §çã«ãã€ãã³ããœãŒã·ã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã«å¯Ÿãããã¹ãŠã®éèŠãªå€æŽãäžå€ã®ã€ãã³ããšããŠãã£ããã£ããããšã«çŠç¹ãåœãŠãŠããŸãããããã®ã€ãã³ãã¯è¿œèšå°çšã®ã€ãã³ãã¹ãã¢ã«ä¿åãããã·ã¹ãã å ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã®å®å šã§æç³»åã®èšé²ã圢æããŸãã
ãããéè¡å£åº§ã®å°åž³ã®ããã«èããŠã¿ãŠãã ãããåã«çŸåšã®æ®é«ãèšé²ããã®ã§ã¯ãªãããã¹ãŠã®é éãåŒãåºããééãåå¥ã®ã€ãã³ããšããŠèšé²ãããŸãããããã®ã€ãã³ãããªãã¬ã€ããããšã§ãä»»æã®æç¹ã®å£åº§ã®ç¶æ ãåæ§ç¯ã§ããŸãã
ç£æ»èšŒè·¡ã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããçç±
ã€ãã³ããœãŒã·ã³ã°ã¯ãç£æ»èšŒè·¡ãå®è£ ããããã«ããã€ãã®èª¬åŸåã®ããå©ç¹ãæäŸããŸãã
- å®å šã§äžå€ãªå±¥æŽ: ãã¹ãŠã®å€æŽãã€ãã³ããšããŠãã£ããã£ãããã·ã¹ãã ã®é²åã®å®å šã§äžå€ãªèšé²ãæäŸããŸããããã«ãããç£æ»èšŒè·¡ã®æ£ç¢ºæ§ãšæ¹ãã鲿¢ãä¿èšŒãããŸãã
- æéçã¯ãšãª: ã€ãã³ãããã®æç¹ãŸã§ãªãã¬ã€ããããšã§ãä»»æã®æç¹ã®ã·ã¹ãã ã®ç¶æ ãç°¡åã«åæ§ç¯ã§ããŸããããã«ãããç£æ»ããã³åæã®ããã®åŒ·åãªæéçã¯ãšãªæ©èœãå¯èœã«ãªããŸãã
- ç£æ»å¯èœã§è¿œè·¡å¯èœ: åã€ãã³ãã«ã¯éåžžãã¿ã€ã ã¹ã¿ã³ãããŠãŒã¶ãŒIDããã©ã³ã¶ã¯ã·ã§ã³IDãªã©ã®ã¡ã¿ããŒã¿ãå«ãŸããŠãããå倿Žã®çºçæºãšåœ±é¿ãç°¡åã«è¿œè·¡ã§ããŸãã
- ãã«ãããªã³ã°ãšã¹ã±ãŒã©ããªãã£: ã€ãã³ããœãŒã·ã³ã°ã¯ãã·ã¹ãã å ã®ç°ãªãéšåéã®ãã«ãããªã³ã°ãä¿é²ããŸããã€ãã³ãã¯è€æ°ã®ãµãã¹ã¯ã©ã€ããŒã«ãã£ãŠæ¶è²»ã§ããã¹ã±ãŒã©ããªãã£ãšæè»æ§ãå¯èœã«ããŸãã
- ãããã°ãšåŸ©æ§ã®ããã®ãªãã¬ã€å¯èœæ§: ã€ãã³ãã¯ããããã°ç®çã§éå»ã®ç¶æ ãåäœæãããããšã©ãŒãã埩æ§ãããããããã«ãªãã¬ã€ã§ããŸãã
- CQRSã®ãµããŒã: ã€ãã³ããœãŒã·ã³ã°ã¯ãèªã¿åãæäœãšæžãèŸŒã¿æäœãåé¢ããã³ãã³ãã¯ãšãªè²¬ä»»åé¢ïŒCQRSïŒãã¿ãŒã³ãšçµã¿åãããŠäœ¿çšãããããšãå€ããããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãããã«åäžãããŸãã
ç£æ»èšŒè·¡ã®ããã®ã€ãã³ããœãŒã·ã³ã°ã®å®è£ ïŒã¹ããããã€ã¹ãããã¬ã€ã
以äžã«ãç£æ»èšŒè·¡ã®ããã«ã€ãã³ããœãŒã·ã³ã°ãå®è£ ããããã®å®è·µçãªã¬ã€ãã瀺ããŸãã
1. äž»èŠãªã€ãã³ããç¹å®ãã
æåã®ã¹ãããã¯ãç£æ»èšŒè·¡ã«ãã£ããã£ãããäž»èŠãªã€ãã³ããç¹å®ããããšã§ãããããã®ã€ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã«å¯ŸããéèŠãªå€æŽã衚ãã¹ãã§ããæ¬¡ã®ãããªã¢ã¯ã·ã§ã³ãæ€èšããŠãã ããã
- ãŠãŒã¶ãŒèªèšŒïŒãã°ã€ã³ããã°ã¢ãŠãïŒ
- ããŒã¿ã®äœæã倿Žãåé€
- ãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ãšå®äº
- èšå®ã®å€æŽ
- ã»ãã¥ãªãã£é¢é£ã€ãã³ãïŒäŸïŒã¢ã¯ã»ã¹å¶åŸ¡ã®å€æŽïŒ
äŸ: eã³ããŒã¹ãã©ãããã©ãŒã ã®å Žåãäž»èŠãªã€ãã³ãã«ã¯ãOrderCreatedãïŒæ³šæäœæïŒããPaymentReceivedãïŒæ¯æãåé ïŒããOrderShippedãïŒæ³šæçºéïŒããProductAddedToCartãïŒååãã«ãŒãã«è¿œå ïŒããUserProfileUpdatedãïŒãŠãŒã¶ãŒãããã¡ã€ã«æŽæ°ïŒãªã©ãå«ãŸããå ŽåããããŸãã
2. ã€ãã³ãæ§é ãå®çŸ©ãã
åã€ãã³ãã¯ã以äžã®æ å ±ãå«ãæç¢ºã«å®çŸ©ãããæ§é ãæã€å¿ èŠããããŸãã
- ã€ãã³ãã¿ã€ã: ã€ãã³ãã®ã¿ã€ããèå¥ããäžæã®èå¥åïŒäŸïŒãOrderCreatedãïŒã
- ã€ãã³ãããŒã¿: ã€ãã³ãã«é¢é£ä»ããããããŒã¿ã泚æIDã補åIDã顧客IDãæ¯æãéé¡ãªã©ã
- ã¿ã€ã ã¹ã¿ã³ã: ã€ãã³ããçºçããæ¥æãç°ãªãã¿ã€ã ãŸãŒã³éã§ã®äžè²«æ§ã®ããã«UTCã®äœ¿çšãæ€èšããŠãã ããã
- ãŠãŒã¶ãŒID: ã€ãã³ããéå§ãããŠãŒã¶ãŒã®IDã
- ãã©ã³ã¶ã¯ã·ã§ã³ID: ã€ãã³ããå±ãããã©ã³ã¶ã¯ã·ã§ã³ã®äžæã®èå¥åãããã¯ãè€æ°ã®ã€ãã³ãã«ãããã¢ãããã¯æ§ãšäžè²«æ§ã確ä¿ããããã«äžå¯æ¬ ã§ãã
- çžé¢ID: ç°ãªããµãŒãã¹ãŸãã¯ã³ã³ããŒãã³ãéã§é¢é£ããã€ãã³ãã远跡ããããã«äœ¿çšãããèå¥åãããã¯ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§ç¹ã«åœ¹ç«ã¡ãŸãã
- åå ID: ïŒãªãã·ã§ã³ïŒãã®ã€ãã³ãã®åå ãšãªã£ãã€ãã³ãã®IDãããã«ãããã€ãã³ãã®å æé¢ä¿ã远跡ããã®ã«åœ¹ç«ã¡ãŸãã
- ã¡ã¿ããŒã¿: ãŠãŒã¶ãŒã®IPã¢ãã¬ã¹ããã©ãŠã¶ã®çš®é¡ãå°ççãªå Žæãªã©ã®è¿œå ã®ã³ã³ããã¹ãæ å ±ãã¡ã¿ããŒã¿ãåéããã³ä¿åããéã¯ãGDPRãªã©ã®ããŒã¿ãã©ã€ãã·ãŒèŠå¶ã«æ³šæããŠãã ããã
äŸ: ãOrderCreatedãã€ãã³ãã¯æ¬¡ã®ãããªæ§é ãæã€å ŽåããããŸãã
{
\"eventType\": \"OrderCreated\",
\"eventData\": {
\"orderId\": \"12345\",
\"customerId\": \"67890\",
\"orderDate\": \"2023-10-27T10:00:00Z\",
\"totalAmount\": 100.00,
\"currency\": \"USD\",
\"shippingAddress\": {
\"street\": \"123 Main St\",
\"city\": \"Anytown\",
\"state\": \"CA\",
\"zipCode\": \"91234\",
\"country\": \"USA\"
}
},
\"timestamp\": \"2023-10-27T10:00:00Z\",
\"userId\": \"user123\",
\"transactionId\": \"tx12345\",
\"correlationId\": \"corr123\",
\"metadata\": {
\"ipAddress\": \"192.168.1.1\",
\"browser\": \"Chrome\",
\"location\": {
\"latitude\": 34.0522,
\"longitude\": -118.2437
}
}
}
3. ã€ãã³ãã¹ãã¢ãéžæãã
ã€ãã³ãã¹ãã¢ã¯ãã€ãã³ããä¿åããããã®äžå€®ãªããžããªã§ããã€ãã³ãã®ã·ãŒã±ã³ã¹ã®æžã蟌ã¿ãšèªã¿åãã«æé©åããã远èšå°çšã®ããŒã¿ããŒã¹ã§ããã¹ãã§ããããã€ãã®ãªãã·ã§ã³ããããŸãã
- å°çšã€ãã³ãã¹ãã¢ããŒã¿ããŒã¹: ãããã¯ãEventStoreDBãAxonDBãªã©ãã€ãã³ããœãŒã·ã³ã°ã®ããã«ç¹å¥ã«èšèšãããããŒã¿ããŒã¹ã§ãããããã¯ãã€ãã³ãã¹ããªãŒã ããããžã§ã¯ã·ã§ã³ããµãã¹ã¯ãªãã·ã§ã³ãªã©ã®æ©èœãæäŸããŸãã
- ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹: PostgreSQLãMySQLã®ãããªãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãã€ãã³ãã¹ãã¢ãšããŠäœ¿çšããããšãã§ããŸãããã ãã远èšå°çšã®ã»ãã³ãã£ã¯ã¹ãšã€ãã³ãã¹ããªãŒã 管çã¯èªåã§å®è£ ããå¿ èŠããããŸããã€ãã³ãIDãã€ãã³ãã¿ã€ããã€ãã³ãããŒã¿ãã¿ã€ã ã¹ã¿ã³ããã¡ã¿ããŒã¿ã®ããã®åãæã€å°çšããŒãã«ãã€ãã³ãã«äœ¿çšããããšãæ€èšããŠãã ããã
- NoSQLããŒã¿ããŒã¹: MongoDBãCassandraã®ãããªNoSQLããŒã¿ããŒã¹ãã€ãã³ãã¹ãã¢ãšããŠäœ¿çšã§ããŸãããããã¯æè»æ§ãšã¹ã±ãŒã©ããªãã£ãæäŸããŸãããå¿ èŠãªæ©èœãå®è£ ããããã«ããå€ãã®åŽåãå¿ èŠã«ãªãå ŽåããããŸãã
- ã¯ã©ãŠãããŒã¹ã®ãœãªã¥ãŒã·ã§ã³: AWSãAzureãGoogle Cloudã®ãããªã¯ã©ãŠããããã€ããŒã¯ãKafkaãKinesisãPub/Subãªã©ã®ãããŒãžãã€ãã³ãã¹ããªãŒãã³ã°ãµãŒãã¹ãæäŸããŠãããããããã€ãã³ãã¹ãã¢ãšããŠäœ¿çšã§ããŸãããããã®ãµãŒãã¹ã¯ãã¹ã±ãŒã©ããªãã£ãä¿¡é Œæ§ãããã³ä»ã®ã¯ã©ãŠããµãŒãã¹ãšã®çµ±åãæäŸããŸãã
ã€ãã³ãã¹ãã¢ãéžæããéã«ã¯ã次ã®ãããªèŠçŽ ãèæ ®ããŠãã ããã
- ã¹ã±ãŒã©ããªãã£: ã€ãã³ãã¹ãã¢ã¯ãäºæ³ãããã€ãã³ãéãåŠçã§ããŸããïŒ
- èä¹ æ§: ããŒã¿æå€±é²æ¢ã®èгç¹ãããã€ãã³ãã¹ãã¢ã¯ã©ã®çšåºŠä¿¡é Œã§ããŸããïŒ
- ã¯ãšãªæ©èœ: ã€ãã³ãã¹ãã¢ã¯ãç£æ»ããã³åæã«å¿ èŠãªçš®é¡ã®ã¯ãšãªããµããŒãããŠããŸããïŒ
- ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒã: ã€ãã³ãã¹ãã¢ã¯ãããŒã¿ã®äžè²«æ§ã確ä¿ããããã«ACIDãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŠããŸããïŒ
- çµ±å: ã€ãã³ãã¹ãã¢ã¯ãæ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããã³ããŒã«ãšããŸãçµ±åãããŸããïŒ
- ã³ã¹ã: ã¹ãã¬ãŒãžãã³ã³ãã¥ãŒãã£ã³ã°ããããã¯ãŒã¯ã³ã¹ããå«ãã€ãã³ãã¹ãã¢ã®äœ¿çšã³ã¹ãã¯ã©ã®ãããã§ããïŒ
4. ã€ãã³ãçºè¡ãå®è£ ãã
ã€ãã³ããçºçããå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ãããã€ãã³ãã¹ãã¢ã«çºè¡ããå¿ èŠããããŸããããã«ã¯éåžžãæ¬¡ã®ã¹ããããå«ãŸããŸãã
- ã€ãã³ããªããžã§ã¯ãã®äœæ: ã€ãã³ãã¿ã€ããã€ãã³ãããŒã¿ãã¿ã€ã ã¹ã¿ã³ãããŠãŒã¶ãŒIDãããã³ãã®ä»ã®é¢é£ããã¡ã¿ããŒã¿ãå«ãã€ãã³ããªããžã§ã¯ããäœæããŸãã
- ã€ãã³ãã®ã·ãªã¢ã«å: ã€ãã³ããªããžã§ã¯ãããJSONãAvroãªã©ãã€ãã³ãã¹ãã¢ã«ä¿åã§ãã圢åŒã«ã·ãªã¢ã«åããŸãã
- ã€ãã³ããã€ãã³ãã¹ãã¢ã«è¿œå : ã·ãªã¢ã«åãããã€ãã³ããã€ãã³ãã¹ãã¢ã«è¿œå ããŸããããŒã¿ç Žæãé²ãããã«ããã®æäœãã¢ãããã¯ã§ããããšã確èªããŠãã ããã
- ã€ãã³ãããµãã¹ã¯ã©ã€ããŒã«çºè¡: ïŒãªãã·ã§ã³ïŒã€ãã³ããåä¿¡ããããšã«é¢å¿ã®ãããµãã¹ã¯ã©ã€ããŒã«ã€ãã³ããçºè¡ããŸããããã¯ãã¡ãã»ãŒãžãã¥ãŒãŸãã¯çºè¡-賌èªãã¿ãŒã³ã䜿çšããŠè¡ãããšãã§ããŸãã
äŸ (æ¶ç©ºã®EventStoreServiceã䜿çš):
public class OrderService {
private final EventStoreService eventStoreService;
public OrderService(EventStoreService eventStoreService) {
this.eventStoreService = eventStoreService;
}
public void createOrder(Order order, String userId) {
// ... business logic to create the order ...
OrderCreatedEvent event = new OrderCreatedEvent(
order.getOrderId(),
order.getCustomerId(),
order.getOrderDate(),
order.getTotalAmount(),
order.getCurrency(),
order.getShippingAddress()
);
eventStoreService.appendEvent(\"order\", order.getOrderId(), event, userId);
}
}
public class EventStoreService {
public void appendEvent(String streamName, String entityId, Object event, String userId) {
// Create an event object
EventRecord eventRecord = new EventRecord(
UUID.randomUUID(), // eventId
streamName, // streamName
entityId, // entityId
event.getClass().getName(), // eventType
toJson(event), // eventData
Instant.now().toString(), // timestamp
userId // userId
);
// Serialize the event
String serializedEvent = toJson(eventRecord);
// Append the event to the event store (implementation specific to the chosen event store)
storeEventInDatabase(serializedEvent);
// Publish the event to subscribers (optional)
publishEventToMessageQueue(serializedEvent);
}
// Placeholder methods for database and message queue interaction
private void storeEventInDatabase(String serializedEvent) {
// Implementation to store the event in the database
System.out.println(\"Storing event in database: \" + serializedEvent);
}
private void publishEventToMessageQueue(String serializedEvent) {
// Implementation to publish the event to a message queue
System.out.println(\"Publishing event to message queue: \" + serializedEvent);
}
private String toJson(Object obj) {
// Implementation to serialize the event to JSON
try {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(obj);
} catch (Exception e) {
throw new RuntimeException(\"Error serializing event to JSON\", e);
}
}
}
class EventRecord {
private final UUID eventId;
private final String streamName;
private final String entityId;
private final String eventType;
private final String eventData;
private final String timestamp;
private final String userId;
public EventRecord(UUID eventId, String streamName, String entityId, String eventType, String eventData, String timestamp, String userId) {
this.eventId = eventId;
this.streamName = streamName;
this.entityId = entityId;
this.eventType = eventType;
this.eventData = eventData;
this.timestamp = timestamp;
this.userId = userId;
}
// Getters
@Override
public String toString() {
return \"EventRecord{\" +
\"eventId=\" + eventId +
\", streamName='\" + streamName + '\\'\' +
\", entityId='\" + entityId + '\\'\' +
\", eventType='\" + eventType + '\\'\' +
\", eventData='\" + eventData + '\\'\' +
\", timestamp='\" + timestamp + '\\'\' +
\", userId='\" + userId + '\\'\' +
'}';
}
}
class OrderCreatedEvent {
private final String orderId;
private final String customerId;
private final String orderDate;
private final double totalAmount;
private final String currency;
private final String shippingAddress;
public OrderCreatedEvent(String orderId, String customerId, String orderDate, double totalAmount, String currency, String shippingAddress) {
this.orderId = orderId;
this.customerId = customerId;
this.orderDate = orderDate;
this.totalAmount = totalAmount;
this.currency = currency;
this.shippingAddress = shippingAddress;
}
// Getters for all fields
public String getOrderId() { return orderId; }
public String getCustomerId() { return customerId; }
public String getOrderDate() { return orderDate; }
public double getTotalAmount() { return totalAmount; }
public String getCurrency() { return currency; }
public String getShippingAddress() { return shippingAddress; }
@Override
public String toString() {
return \"OrderCreatedEvent{\" +
\"orderId='\" + orderId + '\\'\' +
\", customerId='\" + customerId + '\\'\' +
\", orderDate='\" + orderDate + '\\'\' +
\", totalAmount=\" + totalAmount +
\", currency='\" + currency + '\\'\' +
\", shippingAddress='\" + shippingAddress + '\\'\' +
'}';
}
}
class Order {
private final String orderId;
private final String customerId;
private final String orderDate;
private final double totalAmount;
private final String currency;
private final String shippingAddress;
public Order(String orderId, String customerId, String orderDate, double totalAmount, String currency, String shippingAddress) {
this.orderId = orderId;
this.customerId = customerId;
this.orderDate = orderDate;
this.totalAmount = totalAmount;
this.currency = currency;
this.shippingAddress = shippingAddress;
}
// Getters for all fields
public String getOrderId() { return orderId; }
public String getCustomerId() { return customerId; }
public String getOrderDate() { return orderDate; }
public double getTotalAmount() { return totalAmount; }
public String getCurrency() { return currency; }
public String getShippingAddress() { return shippingAddress; }
@Override
public String toString() {
return \"Order{\" +
\"orderId='\" + orderId + '\\'\' +
\", customerId='\" + customerId + '\\'\' +
\", orderDate='\" + orderDate + '\\'\' +
\", totalAmount=\" + totalAmount +
\", currency='\" + currency + '\\'\' +
\", shippingAddress='\" + shippingAddress + '\\'\' +
'}';
}
}
5. èªã¿åãã¢ãã«ïŒãããžã§ã¯ã·ã§ã³ïŒãæ§ç¯ãã
ã€ãã³ãã¹ãã¢ã¯ãã¹ãŠã®å€æŽã®å®å šãªå±¥æŽãæäŸããŸãããèªã¿åãæäœã®ããã«ãããçŽæ¥ã¯ãšãªããããšã¯å¹ççã§ãªãããšããããããŸãã代ããã«ãç¹å®ã®ã¯ãšãªãã¿ãŒã³ã«æé©åãããèªã¿åãã¢ãã«ïŒãããžã§ã¯ã·ã§ã³ãšãåŒã°ããïŒãæ§ç¯ã§ããŸãããããã®èªã¿åãã¢ãã«ã¯ã€ãã³ãã¹ããªãŒã ããæŽŸçããæ°ããã€ãã³ããçºè¡ããããšéåæã§æŽæ°ãããŸãã
äŸ: ç¹å®ã®é¡§å®¢ã®ãã¹ãŠã®æ³šæã®ãªã¹ããå«ãèªã¿åãã¢ãã«ããç¹å®ã®è£œåã®è²©å£²ããŒã¿ãèŠçŽããèªã¿åãã¢ãã«ãäœæã§ããŸãã
èªã¿åãã¢ãã«ãæ§ç¯ããã«ã¯ãã€ãã³ãã¹ããªãŒã ã賌èªããåã€ãã³ããåŠçããŸããåã€ãã³ãã«ã€ããŠãããã«å¿ããŠèªã¿åãã¢ãã«ãæŽæ°ããŸãã
äŸ:
public class OrderSummaryReadModelUpdater {
private final OrderSummaryRepository orderSummaryRepository;
public OrderSummaryReadModelUpdater(OrderSummaryRepository orderSummaryRepository) {
this.orderSummaryRepository = orderSummaryRepository;
}
public void handle(OrderCreatedEvent event) {
OrderSummary orderSummary = new OrderSummary(
event.getOrderId(),
event.getCustomerId(),
event.getOrderDate(),
event.getTotalAmount(),
event.getCurrency()
);
orderSummaryRepository.save(orderSummary);
}
// Other event handlers for PaymentReceivedEvent, OrderShippedEvent, etc.
}
interface OrderSummaryRepository {
void save(OrderSummary orderSummary);
}
class OrderSummary {
private final String orderId;
private final String customerId;
private final String orderDate;
private final double totalAmount;
private final String currency;
public OrderSummary(String orderId, String customerId, String orderDate, double totalAmount, String currency) {
this.orderId = orderId;
this.customerId = customerId;
this.orderDate = orderDate;
this.totalAmount = totalAmount;
this.currency = currency;
}
//Getters
}
6. ã€ãã³ãã¹ãã¢ãä¿è·ãã
ã€ãã³ãã¹ãã¢ã«ã¯æ©å¯ããŒã¿ãå«ãŸããŠãããããé©åã«ä¿è·ããããšãéèŠã§ããæ¬¡ã®ã»ãã¥ãªãã£å¯Ÿçãæ€èšããŠãã ããã
- ã¢ã¯ã»ã¹å¶åŸ¡: ã€ãã³ãã¹ãã¢ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããããŠãŒã¶ãŒãšã¢ããªã±ãŒã·ã§ã³ã®ã¿ã«å¶éããŸãã匷åãªèªèšŒããã³èªå¯ã¡ã«ããºã ã䜿çšããŠãã ããã
- æå·å: äžæ£ã¢ã¯ã»ã¹ããä¿è·ããããã«ãã€ãã³ãã¹ãã¢å ã®ããŒã¿ãä¿åæãšè»¢éæã«æå·åããŸããã»ãã¥ãªãã£ã匷åããããã«ãããŒããŠã§ã¢ã»ãã¥ãªãã£ã¢ãžã¥ãŒã«ïŒHSMïŒã§ç®¡çãããæå·åããŒã®äœ¿çšãæ€èšããŠãã ããã
- ç£æ»: äžæ£ãªã¢ã¯ãã£ããã£ãæ€åºããã³é²æ¢ããããã«ãã€ãã³ãã¹ãã¢ãžã®ãã¹ãŠã®ã¢ã¯ã»ã¹ãç£æ»ããŸãã
- ããŒã¿ãã¹ãã³ã°: äžæ£ãªé瀺ããä¿è·ããããã«ãã€ãã³ãã¹ãã¢å ã®æ©å¯ããŒã¿ããã¹ãã³ã°ããŸããäŸãã°ãã¯ã¬ãžããã«ãŒãçªå·ã瀟äŒä¿éçªå·ãªã©ã®å人ãç¹å®ã§ããæ å ±ïŒPIIïŒããã¹ãã³ã°ããããšãã§ããŸãã
- 宿ããã¯ã¢ãã: ããŒã¿æå€±ããä¿è·ããããã«ãã€ãã³ãã¹ãã¢ã宿çã«ããã¯ã¢ããããŸããããã¯ã¢ããã¯å®å šãªå Žæã«ä¿ç®¡ããŠãã ããã
- çœå®³åŸ©æ§: çœå®³çºçæã«ã€ãã³ãã¹ãã¢ã埩æ§ã§ããããã«ãçœå®³åŸ©æ§èšç»ãå®è£ ããŸãã
7. ç£æ»ãšã¬ããŒãæ©èœãå®è£ ãã
ã€ãã³ããœãŒã·ã³ã°ãå®è£ ããããã€ãã³ãã¹ããªãŒã ã䜿çšããŠç£æ»ã¬ããŒããçæããã»ãã¥ãªãã£åæãå®è¡ã§ããŸããã€ãã³ãã¹ãã¢ãã¯ãšãªããŠãç¹å®ã®ãŠãŒã¶ãŒããã©ã³ã¶ã¯ã·ã§ã³ããŸãã¯ãšã³ãã£ãã£ã«é¢é£ãããã¹ãŠã®ã€ãã³ããèŠã€ããããšãã§ããŸãããŸããã€ãã³ãã¹ããªãŒã ã䜿çšããŠãä»»æã®æç¹ã®ã·ã¹ãã ã®ç¶æ ãåæ§ç¯ããããšãã§ããŸãã
äŸ: ç¹å®ã®æéã«ç¹å®ã®ãŠãŒã¶ãŒãããã¡ã€ã«ã«å¯ŸããŠè¡ããããã¹ãŠã®å€æŽã瀺ãã¬ããŒãããç¹å®ã®ãŠãŒã¶ãŒã«ãã£ãŠéå§ããããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ã瀺ãã¬ããŒããçæã§ããŸãã
以äžã®ã¬ããŒãæ©èœãæ€èšããŠãã ããã
- ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã¬ããŒã: ãŠãŒã¶ãŒã®ãã°ã€ã³ããã°ã¢ãŠããããã³ãã®ä»ã®ã¢ã¯ãã£ããã£ã远跡ããŸãã
- ããŒã¿å€æŽã¬ããŒã: éèŠãªããŒã¿ãšã³ãã£ãã£ãžã®å€æŽãç£èŠããŸãã
- ã»ãã¥ãªãã£ã€ãã³ãã¬ããŒã: ãã°ã€ã³è©Šè¡ã®å€±æãäžæ£ã¢ã¯ã»ã¹è©Šè¡ãªã©ã®äžå¯©ãªã¢ã¯ãã£ããã£ã«ã€ããŠèŠåããŸãã
- ã³ã³ãã©ã€ã¢ã³ã¹ã¬ããŒã: èŠå¶éµå®ïŒäŸïŒGDPRãHIPAAïŒã«å¿ èŠãªã¬ããŒããçæããŸãã
ã€ãã³ããœãŒã·ã³ã°ã®èª²é¡
ã€ãã³ããœãŒã·ã³ã°ã«ã¯å€ãã®å©ç¹ããããŸãããããã€ãã®èª²é¡ãæç€ºããŸãã
- è€éæ§: ã€ãã³ããœãŒã·ã³ã°ã¯ã·ã¹ãã ã¢ãŒããã¯ãã£ã«è€éæ§ãå ããŸããã€ãã³ãæ§é ãèšèšããã€ãã³ãã¹ãã¢ãéžæããã€ãã³ãã®çºè¡ãšæ¶è²»ãå®è£ ããå¿ èŠããããŸãã
- çµææŽåæ§: èªã¿åãã¢ãã«ã¯ã€ãã³ãã¹ããªãŒã ã«å¯ŸããŠæçµçã«æŽåããŸããããã¯ãã€ãã³ããçºçããŠããèªã¿åãã¢ãã«ãæŽæ°ããããŸã§ã«é å»¶ãããå¯èœæ§ãããããšãæå³ããŸããããã«ããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã§äžæŽåãçããå¯èœæ§ããããŸãã
- ã€ãã³ãã®ããŒãžã§ã³ç®¡ç: ã¢ããªã±ãŒã·ã§ã³ãé²åããã«ã€ããŠãã€ãã³ãã®æ§é ã倿Žããå¿ èŠãããå ŽåããããŸããããã¯ãæ¢åã®ã€ãã³ããåŒãç¶ãæ£ããåŠçãããããšãä¿èšŒããå¿ èŠããããããå°é£ãªå ŽåããããŸããç°ãªãã€ãã³ãããŒãžã§ã³ãåŠçããããã«ãã€ãã³ãã¢ãããã£ã¹ãã£ã³ã°ã®ãããªææ³ã䜿çšããããšãæ€èšããŠãã ããã
- çµææŽåæ§ãšåæ£ãã©ã³ã¶ã¯ã·ã§ã³: ã€ãã³ããœãŒã·ã³ã°ã§åæ£ãã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ããããšã¯è€éã«ãªãå¯èœæ§ããããŸããè€æ°ã®ãµãŒãã¹éã§ã€ãã³ããæŽåæ§ã®ããæ¹æ³ã§çºè¡ããã³æ¶è²»ãããããšã確èªããå¿ èŠããããŸãã
- éçšãªãŒããŒããã: ã€ãã³ãã¹ãã¢ãšãã®é¢é£ã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããããšã¯ãéçšãªãŒããŒãããã远å ããå¯èœæ§ããããŸããã€ãã³ãã¹ãã¢ãç£èŠããããã¯ã¢ããããã¹ã ãŒãºã«åäœããŠããããšã確èªããå¿ èŠããããŸãã
ã€ãã³ããœãŒã·ã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
ã€ãã³ããœãŒã·ã³ã°ã®èª²é¡ã軜æžããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- å°ããå§ãã: ã¢ããªã±ãŒã·ã§ã³ã®å°ããªéšåã§ã€ãã³ããœãŒã·ã³ã°ãå®è£ ããããšããå§ããŸããããã«ãããæŠå¿µãåŠã³ãããè€éãªé åã«é©çšããåã«çµéšãç©ãããšãã§ããŸãã
- ãã¬ãŒã ã¯ãŒã¯ã䜿çšãã: Axon FrameworkãSpring Cloud Streamã®ãããªãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãã€ãã³ããœãŒã·ã³ã°ã®å®è£ ãç°¡çŽ åããŸãããããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãã€ãã³ãããããžã§ã¯ã·ã§ã³ããµãã¹ã¯ãªãã·ã§ã³ã管çããã®ã«åœ¹ç«ã€æœè±¡åãšããŒã«ãæäŸããŸãã
- ã€ãã³ããæ éã«èšèšãã: å¿ èŠãªãã¹ãŠã®æ å ±ããã£ããã£ã§ããããã«ãã€ãã³ããæ éã«èšèšããŸããã€ãã³ãã«ããŸãã«ãå€ãã®æ å ±ãå«ããªãã§ãã ãããããã«ãããåŠçãå°é£ã«ãªãå¯èœæ§ããããŸãã
- ã€ãã³ãã¢ãããã£ã¹ãã£ã³ã°ãå®è£ ãã: ã€ãã³ãã®æ§é ãžã®å€æŽãåŠçããããã«ã€ãã³ãã¢ãããã£ã¹ãã£ã³ã°ãå®è£ ããŸããããã«ãããã€ãã³ãæ§é ã倿ŽãããåŸã§ãæ¢åã®ã€ãã³ããåŠçã§ããããã«ãªããŸãã
- ã·ã¹ãã ãç£èŠãã: ãšã©ãŒãæ€åºããã³é²æ¢ããããã«ãã·ã¹ãã ãç¶¿å¯ã«ç£èŠããŸããã€ãã³ãã¹ãã¢ãã€ãã³ãçºè¡ããã»ã¹ãããã³èªã¿åãã¢ãã«ã®æŽæ°ãç£èŠããŸãã
- åªçæ§ãåŠçãã: ã€ãã³ããã³ãã©ãŒãåªçã§ããããšã確èªããŸããããã¯ãåãã€ãã³ããè€æ°ååŠçããŠã害ãåãŒããªãããšãæå³ããŸãã忣ã·ã¹ãã ã§ã¯ã€ãã³ããè€æ°åé ä¿¡ãããå¯èœæ§ããããããããã¯éèŠã§ãã
- è£åãã©ã³ã¶ã¯ã·ã§ã³ãæ€èšãã: ã€ãã³ããçºè¡ãããåŸã«æäœã倱æããå Žåã倿Žãå ã«æ»ãããã«è£åãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããå¿ èŠãããå ŽåããããŸããäŸãã°ã泚æãäœæããããã®ã®æ¯æãã倱æããå Žåãæ³šæããã£ã³ã»ã«ããå¿ èŠããããããããŸããã
ã€ãã³ããœãŒã·ã³ã°ã®çŸå®äžçã§ã®äŸ
ã€ãã³ããœãŒã·ã³ã°ã¯ã以äžãå«ãããŸããŸãªæ¥çãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããŸãã
- éèãµãŒãã¹: éè¡ãéèæ©é¢ã¯ãååŒã远跡ããå£åº§ã管çããäžæ£ãæ€åºããããã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠããŸãã
- Eã³ããŒã¹: Eã³ããŒã¹äŒæ¥ã¯ã泚æã管çããåšåº«ã远跡ãã顧客äœéšãããŒãœãã©ã€ãºããããã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠããŸãã
- ã²ãŒãã³ã°: ã²ãŒã éçºè ã¯ãã²ãŒã ã®ç¶æ ã远跡ãããã¬ã€ã€ãŒã®é²è¡ç¶æ³ã管çãããã«ããã¬ã€ã€ãŒæ©èœãå®è£ ããããã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠããŸãã
- ãµãã©ã€ãã§ãŒã³ç®¡ç: ãµãã©ã€ãã§ãŒã³äŒæ¥ã¯ãååã远跡ããåšåº«ã管çããããžã¹ãã£ã¯ã¹ãæé©åããããã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠããŸãã
- ãã«ã¹ã±ã¢: ãã«ã¹ã±ã¢ãããã€ããŒã¯ãæ£è ã®èšé²ã远跡ããäºçŽã管çããæ£è ã±ã¢ãæ¹åããããã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠããŸãã
- ã°ããŒãã«ããžã¹ãã£ã¯ã¹: ããŒã¹ã¯ãDHLã®ãããªäŒæ¥ã¯ãã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠäžçäžã®è²šç©ã远跡ãããShipmentDepartedPortãïŒæž¯åºçºïŒããShipmentArrivedPortãïŒæž¯å°çïŒããCustomsClearanceStartedãïŒéé¢éå§ïŒããShipmentDeliveredãïŒè²šç©é éæžã¿ïŒãªã©ã®ã€ãã³ãããã£ããã£ã§ããŸããããã«ãããå貚ç©ã«ã€ããŠå®å šãªç£æ»èšŒè·¡ãäœæãããŸãã
- åœééè¡æ¥å: HSBCãã¹ã¿ã³ããŒããã£ãŒã¿ãŒãã®ãããªéè¡ã¯ãã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠåœéééã远跡ãããTransferInitiatedãïŒéééå§ïŒããCurrencyExchangeExecutedãïŒé貚亀æå®è¡ïŒããFundsSentToBeneficiaryBankãïŒååéè¡ã«ééæžã¿ïŒããFundsReceivedByBeneficiaryãïŒåå人ã«ããè³éåé æžã¿ïŒãªã©ã®ã€ãã³ãããã£ããã£ã§ããŸããããã«ãããèŠå¶éµå®ãä¿èšŒãããäžæ£æ€åºãä¿é²ãããŸãã
çµè«
ã€ãã³ããœãŒã·ã³ã°ã¯ãç£æ»èšŒè·¡ã®å®è£ ã驿°ã§ãã匷åãªã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ããããã¯æ¯é¡ãªã远跡å¯èœæ§ãããŒã¿æŽåæ§ãããã³ã·ã¹ãã å埩åãæäŸããŸããããã€ãã®èª²é¡ãããäžæ¹ã§ãã€ãã³ããœãŒã·ã³ã°ã®å©ç¹ã¯ãç¹ã«è€éã§éèŠãªã·ã¹ãã ã®å Žåãã³ã¹ããäžåãããšããããããŸãããã®ã¬ã€ãã«æŠèª¬ãããŠãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã€ãã³ããœãŒã·ã³ã°ãæåè£ã«å®è£ ããå ç¢ã§ç£æ»å¯èœãªã·ã¹ãã ãæ§ç¯ã§ããŸãã